package com.ruoyi.tenant;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class TenantFilterAspect {

    /**
     * 定义切点：拦截所有被 @TenantFilter 注解的方法
     */
    @Pointcut("@annotation(com.ruoyi.tenant.TenantFilter)")
    public void tenantFilterPointcut() {}

    /**
     * 环绕通知：在方法执行前动态修改查询参数，注入tenant_id条件
     */
    @Around("tenantFilterPointcut()")
    public Object applyTenantFilter(ProceedingJoinPoint joinPoint) throws Throwable {
        // 1. 获取当前租户ID
        String currentTenantId = TenantContext.getCurrentTenant();
        if (currentTenantId == null) {
            throw new RuntimeException("无法获取当前租户信息，请检查TenantInterceptor配置");
        }

        // 2. 获取方法参数，寻找可以设置tenantId的对象
        Object[] args = joinPoint.getArgs();
        for (int i = 0; i < args.length; i++) {
            if (args[i] instanceof QueryWrapper) {
                // 情况1：参数是MyBatis-Plus的QueryWrapper
                QueryWrapper<?> queryWrapper = (QueryWrapper<?>) args[i];
                queryWrapper.eq("tenant_id", currentTenantId);
                args[i] = queryWrapper;
            } else if (args[i] instanceof TenantEntity) {
                // 情况2：参数是实体对象，且该实体有tenantId字段
                TenantEntity entity = (TenantEntity) args[i];
                entity.setTenantId(currentTenantId);
                args[i] = entity;
            }
            // 可以扩展其他参数类型的处理逻辑
        }

        // 3. 执行原方法
        return joinPoint.proceed(args);
    }
}
